// Copyright 2019 The Clspv Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef CLSPV_LIB_BUILTINSENUM_H_
#define CLSPV_LIB_BUILTINSENUM_H_

namespace clspv {
namespace Builtins {

enum BuiltinType {
  kBuiltinNone = 0,

  kType_Clspv_Start,
  kClspvResource,
  kClspvLocal,
  kSpirvOp,
  kSpirvAtomicXor,
  kSpirvCopyMemory,
  kClspvSamplerVarLiteral,
  kClspvCompositeConstruct,
  kType_Clspv_End,

  kType_Async_Start,
  kAsyncWorkGroupCopy,
  kAsyncWorkGroupStridedCopy,
  kWaitGroupEvents,
  kPrefetch,
  kType_Async_End,

  kType_Atomic_Start,
  kAtomicInit,
  kAtomicAdd,
  kAtomicSub,
  kAtomicInc,
  kAtomicDec,
  kAtomicXchg,
  kAtomicCmpxchg,
  kAtomicMin,
  kAtomicMax,
  kAtomicAnd,
  kAtomicOr,
  kAtomicXor,
  kAtomicWorkItemFence,
  kAtomicStore,
  kAtomicStoreExplicit,
  kAtomicLoad,
  kAtomicLoadExplicit,
  kAtomicExchange,
  kAtomicExchangeExplicit,
  kAtomicCompareExchangeStrong,
  kAtomicCompareExchangeStrongExplicit,
  kAtomicCompareExchangeWeak,
  kAtomicCompareExchangeWeakExplicit,
  kAtomicFetchAdd,
  kAtomicFetchAddExplicit,
  kAtomicFetchSub,
  kAtomicFetchSubExplicit,
  kAtomicFetchOr,
  kAtomicFetchOrExplicit,
  kAtomicFetchXor,
  kAtomicFetchXorExplicit,
  kAtomicFetchAnd,
  kAtomicFetchAndExplicit,
  kAtomicFetchMin,
  kAtomicFetchMinExplicit,
  kAtomicFetchMax,
  kAtomicFetchMaxExplicit,
  kAtomicFlagTestAndSet,
  kAtomicFlagTestAndSetExplicit,
  kAtomicFlagClear,
  kAtomicFlagClearExplicit,
  kType_Atomic_End,

  kType_Common_Start,
  kDegrees,
  kMix,
  kRadians,
  kSign,
  kSmoothstep,
  kStep,
  kType_Common_End,

  kType_Convert_Start,
  kConvert,
  kSpirvPack,
  kSpirvUnpack,
  kType_Convert_End,

  kType_Event_Start,
  kRetainEvent,
  kReleaseEvent,
  kCreateUserEvent,
  kIsValidEvent,
  kSetUserEventStatus,
  kType_Event_End,

  kType_MemoryFence_Start,
  kMemFence,
  kReadMemFence,
  kWriteMemFence,
  kType_MemoryFence_End,

  kType_Geometric_Start,
  kCross,
  kDot,
  kDistance,
  kLength,
  kNormalize,
  kFastDistance,
  kFastLength,
  kFastNormalize,
  kType_Geometric_End,

  kType_Image_Start,
  kReadImagef,
  kReadImagei,
  kReadImageui,
  kReadImageh,
  kWriteImagef,
  kWriteImagei,
  kWriteImageui,
  kWriteImageh,
  kGetImageWidth,
  kGetImageHeight,
  kGetImageDepth,
  kGetImageChannelDataType,
  kGetImageChannelOrder,
  kGetImageDim,
  kGetImageArraySize,
  kGetImageNumSamples,
  kType_Image_End,

  kType_Integer_Start,
  kAbs,
  kAbsDiff,
  kAddSat,
  kClamp,
  kClz,
  kCtz,
  kHadd,
  kMad24,
  kMadHi,
  kMadSat,
  kMax,
  kMin,
  kMul24,
  kMulHi,
  kPopcount,
  kRhadd,
  kRotate,
  kSubSat,
  kUpsample,
  kType_Integer_End,

  kType_Math_Start,
  kAcos,
  kAcosh,
  kAcospi,
  kAsin,
  kAsinh,
  kAsinpi,
  kAtan,
  kAtan2,
  kAtanh,
  kAtanpi,
  kAtan2pi,
  kCbrt,
  kCeil,
  kCopysign,
  kCos,
  kHalfCos,
  kNativeCos,
  kCosh,
  kCospi,
  kHalfDivide,
  kNativeDivide,
  kErf,
  kErfc,
  kExp,
  kHalfExp,
  kNativeExp,
  kExp2,
  kHalfExp2,
  kNativeExp2,
  kExp10,
  kHalfExp10,
  kNativeExp10,
  kExpm1,
  kFabs,
  kFdim,
  kFloor,
  kFma,
  kFmax,
  kFmin,
  kFmod,
  kClspvFract,
  kFract,
  kFrexp,
  kHypot,
  kIlogb,
  kLdexp,
  kLgamma,
  kLgammaR,
  kLog,
  kHalfLog,
  kNativeLog,
  kLog2,
  kHalfLog2,
  kNativeLog2,
  kLog10,
  kHalfLog10,
  kNativeLog10,
  kLog1p,
  kLogb,
  kMad,
  kMagmax,
  kMagmin,
  kModf,
  kNan,
  kNextafter,
  kPow,
  kPown,
  kPowr,
  kHalfPowr,
  kNativePowr,
  kHalfRecip,
  kNativeRecip,
  kRemainder,
  kRemquo,
  kRint,
  kRound,
  kRootn,
  kRsqrt,
  kHalfRsqrt,
  kNativeRsqrt,
  kSin,
  kHalfSin,
  kNativeSin,
  kSincos,
  kSinh,
  kSinpi,
  kSqrt,
  kHalfSqrt,
  kNativeSqrt,
  kTan,
  kHalfTan,
  kNativeTan,
  kTanh,
  kTanpi,
  kTgamma,
  kTrunc,
  kType_Math_End,

  kType_Relational_Start,
  kIsequal,
  kIsnotequal,
  kIsgreater,
  kIsgreaterequal,
  kIsless,
  kIslessequal,
  kIslessgreater,
  kIsfinite,
  kIsinf,
  kIsnan,
  kIsnormal,
  kIsordered,
  kIsunordered,
  kSignbit,
  kAny,
  kAll,
  kBitselect,
  kSelect,
  kType_Relational_End,

  kType_Sync_Start,
  kBarrier,
  kWorkGroupBarrier,
  kType_Sync_End,

  kType_Vector_Start,
  kShuffle,
  kShuffle2,
  kVecStep,
  kVload,
  kVloadHalf,
  kVloadaHalf,
  kVstore,
  kVstoreHalf,
  kVstoreaHalf,
  kType_Vector_End,

  kType_WorkItem_Start,
  kGetGlobalId,
  kGetGlobalSize,
  kGetGlobalOffset,
  kGetGlobalLinearId,
  kGetGroupId,
  kGetLocalId,
  kGetLocalLinearId,
  kGetLocalSize,
  kGetEnqueuedLocalSize,
  kGetNumGroups,
  kGetWorkDim,
  kType_WorkItem_End,

  kType_Pipe_Start,
  kReadPipe,
  kWritePipe,
  kReserveReadPipe,
  kCommitReadPipe,
  kIsValidReserveId,
  kWorkGroupReserveReadPipe,
  kWorkGroupReserveWritePipe,
  kWorkGroupCommitReadPipe,
  kWorkGroupCommitWritePipe,
  kGetPipeNumPackets,
  kGetPipeMaxPackets,
  kType_Pipe_End,

  kType_SubgroupsKHR_Start,
  kGetSubGroupSize,
  kGetMaxSubGroupSize,
  kGetNumSubGroups,
  kGetEnqueuedNumSubGroups,
  kGetSubGroupId,
  kGetSubGroupLocalId,
  kSubGroupBarrier,
  kSubGroupAll,
  kSubGroupAny,
  kSubGroupBroadcast,
  kSubGroupReduceAdd,
  kSubGroupReduceMin,
  kSubGroupReduceMax,
  kSubGroupScanExclusiveAdd,
  kSubGroupScanExclusiveMin,
  kSubGroupScanExclusiveMax,
  kSubGroupScanInclusiveAdd,
  kSubGroupScanInclusiveMin,
  kSubGroupScanInclusiveMax,
  kSubGroupReserveReadPipe,
  kSubGroupReserveWritePipe,
  kSubGroupCommitReadPipe,
  kSubGroupCommitWritePipe,
  kGetKernelSubGroupCountForNdrange,
  kGetKernelMaxSubGroupSizeForNdrange,
  kType_SubgroupsKHR_End,
}; // enum BuiltinType

} // namespace Builtins
} // namespace clspv

#endif // CLSPV_LIB_BUILTINSENUM_H_
